class Solution {
public:
    int totalFruit(vector<int>& fruits) {
      int A =-1;
      int B=-1;
      int A_n=0;
      int B_n=0;
      int nums=0;
      int mx=0;
      int left=0;
      int right=0;
      for( left=0,right=0;right<fruits.size();)
      {
          if(nums<2)
          {
              if(A==fruits[right])
              {
                right++;
                A_n++;
              }
              else if(B==fruits[right])
              {
                right++;
                B_n++;
              }
              else
              {
                  if(A==-1)
                  {
                    A=fruits[right++];
                    A_n++;
                  }
                  else
                  {
                      B=fruits[right++];
                      B_n++;
                  }
                  nums++;
              }
          }
          else
          {
              if(A==fruits[right])
              {
                  right++;
                  A_n++;
              }
              else if(B==fruits[right])
              {
                  right++;
                  B_n++;
              }
              else
              {
                  mx = max(mx,right-left);
                  if(A==fruits[left])
                  {
                      while(fruits[left]==A){A_n--;left++;}
                      if(A_n==0)
                        {
                            A=-1;
                            nums--;
                        }
                  }
                  else if(B==fruits[left])
                  {
                      while(fruits[left]==B){B_n--;left++;}
                      if(B_n==0)
                      {
                        B=-1;
                        nums--;
                      } 
                  }
                  
              }
          }
      }
      return max(mx,right-left);
    }
};

//哈希表解决
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
    unordered_map<int,int> hash;
    int mx=0;
    for(int left=0,right=0;right<fruits.size();right++)
    {
        //进窗口
        hash[fruits[right]]++;
        //判断
        while(hash.size()>2)
        {
            //出窗口
            hash[fruits[left]]--;
            if(hash[fruits[left]]==0)
            {
                hash.erase(fruits[left]);
            }
            left++;
        }
        //更新结果
        mx = max(mx,right-left+1);
    }
    return mx;
    }
};